﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SoftHotel.Models;

namespace SoftHotel.Controllers
{ 
    public class ListaPreciosController : Controller
    {
        private ListaPreciosDAO db = new ListaPreciosDAO();

        //
        // GET: /ListaPrecios/

        public ViewResult Index(int? id)
        {
            var listasprecios = db.Sedes.Include(l => l.pTipo);
            if (id > 0)
            {
                listasprecios = listasprecios.Where(a => a.idSede == id);
            }
            return View(listasprecios.ToList());
        }

        //
        // GET: /ListaPrecios/Details/5

        public ViewResult Details(int id)
        {
            Sede listaprecios = db.Sedes.Find(id);
            return View(listaprecios);
        }

        //
        // GET: /ListaPrecios/Create

        public ActionResult Create()
        {
            ViewBag.tipo = new SelectList(db.Parametros, "idParametro", "valor");
            return View();
        }

        //
        // GET: /ListaPrecios/SearchIndex

        public ActionResult SearchIndex()
        {
            ViewBag.idSede = new SelectList(db.Sedes, "idSede", "nombre");
            return View();
        }

        [HttpPost]
        public ActionResult SearchIndex(DetallePrecio detalleprecio)
        {
            if (detalleprecio.idSede > 0) 
            {
                return RedirectToAction("Index/" + detalleprecio.idSede);
            }
            return RedirectToAction("Index");
        }


        //
        // GET: /ListaPrecios/AddAmbiente

        public ActionResult AddServicio(int idS)
        {
            ViewBag.idSede = new SelectList(db.Sedes.Where(a => a.idSede == idS), "idSede", "nombre");
            ViewBag.unidadMedida = new SelectList(db.Parametros.Where(a => a.tipo == "UNIDAD_MEDIDA"), "idParametro", "valor");
            ViewBag.idServicio = new SelectList(db.Servicios.Where(a => a.idSede == idS), "idServicio", "nombre");
            ViewBag.moneda = new SelectList(db.Parametros.Where(a => a.tipo == "MONEDA"), "idParametro", "valor");
            ViewBag.idS = idS;
            return View();
        }

        //
        // POST: /ListaPrecios/AddServicio

        [HttpPost]
        public ActionResult AddServicio(DetallePrecio detalleprecio)
        {
            if (ModelState.IsValid)
            {
               DetallePrecio oldDetalle = null;
               bool siDesactivar = db.DetallesPrecio.Any(a => a.idSede == detalleprecio.idSede && a.idServicio == detalleprecio.idServicio && a.fechaDesactivacion == null);
               if (siDesactivar)
               {
                   oldDetalle = db.DetallesPrecio.First(a => a.idSede == detalleprecio.idSede && a.idServicio == detalleprecio.idServicio && a.fechaDesactivacion == null);
               }
                if (oldDetalle != null) { 
                    oldDetalle.fechaDesactivacion = DateTime.Now; 
                }
                
                db.DetallesPrecio.Add(detalleprecio);
                db.SaveChanges();
                return RedirectToAction("Edit/" + detalleprecio.idSede);
            }

            ViewBag.idSede = new SelectList(db.Sedes.Where(a => a.idSede == detalleprecio.idSede), "idSede", "nombre");
            ViewBag.unidadMedida = new SelectList(db.Parametros.Where(a => a.tipo == "UNIDAD_MEDIDA"), "idParametro", "valor");
            ViewBag.idServicio = new SelectList(db.Servicios.Where(a => a.idSede == detalleprecio.idSede), "idServicio", "nombre");
            ViewBag.moneda = new SelectList(db.Parametros.Where(a => a.tipo == "MONEDA"), "idParametro", "valor");
            ViewBag.idS = detalleprecio.idSede;
            return View(detalleprecio);
        }


        //
        // GET: /ListaPrecios/AddAmbiente

        public ActionResult AddAmbiente(int idS)
        {

            var q = from i in db.Parametros
            join it in db.Ambientes on i.idParametro equals it.tipoAmbiente
            where idS == it.idSede
            select i;

            ViewBag.idSede = new SelectList(db.Sedes.Where(a => a.idSede == idS), "idSede", "nombre");
            ViewBag.unidadMedida = new SelectList(db.Parametros.Where(a => a.tipo == "UNIDAD_MEDIDA"), "idParametro", "valor");
            ViewBag.tipoAmbiente = new SelectList(q.Distinct(), "idParametro", "valor");
            ViewBag.moneda = new SelectList(db.Parametros.Where(a => a.tipo == "MONEDA"), "idParametro", "valor");
            ViewBag.idS = idS;
            return View();
        }

        //
        // POST: /ListaPrecios/AddAmbiente

        [HttpPost]
        public ActionResult AddAmbiente(DetallePrecio detalleprecio)
        {
            if (ModelState.IsValid)
            {
                DetallePrecio oldDetalle = null;
                bool siDesactivar = db.DetallesPrecio.Any(a => a.idSede == detalleprecio.idSede && a.tipoAmbiente == detalleprecio.tipoAmbiente && a.fechaDesactivacion == null);
                if (siDesactivar)
                {
                    oldDetalle = db.DetallesPrecio.First(a => a.idSede == detalleprecio.idSede && a.tipoAmbiente == detalleprecio.tipoAmbiente && a.fechaDesactivacion == null);
                }
                if (oldDetalle != null)
                {
                    oldDetalle.fechaDesactivacion = DateTime.Now;
                }

                db.DetallesPrecio.Add(detalleprecio);
                db.SaveChanges();
                return RedirectToAction("Edit/" + detalleprecio.idSede);
            }

            var q = from i in db.Parametros
                    join it in db.Ambientes on i.idParametro equals it.tipoAmbiente
                    where detalleprecio.idSede == it.idSede
                    select i;

            ViewBag.idSede = new SelectList(db.Sedes.Where(a => a.idSede == detalleprecio.idSede), "idSede", "nombre");
            ViewBag.unidadMedida = new SelectList(db.Parametros.Where(a => a.tipo == "UNIDAD_MEDIDA"), "idParametro", "valor");
            ViewBag.tipoAmbiente = new SelectList(q.Distinct(), "idParametro", "valor");
            ViewBag.moneda = new SelectList(db.Parametros.Where(a => a.tipo == "MONEDA"), "idParametro", "valor");
            ViewBag.idS = detalleprecio.idSede;
            return View(detalleprecio);
        }



        //
        // POST: /ListaPrecios/Create

        [HttpPost]
        public ActionResult Create(Sede listaprecios)
        {
            if (ModelState.IsValid)
            {
                db.Sedes.Add(listaprecios);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }
                
            ViewBag.tipo = new SelectList(db.Parametros, "idParametro", "valor", listaprecios.tipo);
            return View(listaprecios);
        }
        
        //
        // GET: /ListaPrecios/Edit/5
 
        public ActionResult Edit(int id)
        {
            var listasprecios = db.Sedes.Include("pTipo").Where(s => s.idSede == id);
            Sede listaprecios = listasprecios.First();
            var detallesprecio = db.DetallesPrecio.Where(a => a.idSede == id).Include(d => d.sede).Include(d => d.servicio).Include(d => d.pUnidadMedida).Include(d => d.pTipoAmbiente).Include(d => d.pMoneda).OrderByDescending(d => d.fechaActivacion);
            ViewBag.nombreHotel = listaprecios.nombre;
            ViewBag.listaprecios = listaprecios;

            return View(detallesprecio);
        }

        //
        // POST: /ListaPrecios/Edit/5

        [HttpPost]
        public ActionResult Edit(ListaPrecios listaprecios)
        {
            if (ModelState.IsValid)
            {
                db.Entry(listaprecios).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.tipo = new SelectList(db.Parametros, "idParametro", "valor", listaprecios.tipo);
            return View(listaprecios);
        }

        //
        // GET: /ListaPrecios/Delete/5
 
        public ActionResult Delete(int id)
        {
            Sede listaprecios = db.Sedes.Find(id);
            return View(listaprecios);
        }

        //
        // POST: /ListaPrecios/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {            
            Sede listaprecios = db.Sedes.Find(id);
            db.Sedes.Remove(listaprecios);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        //
        // GET: /ListaPrecios/Disable/5

        public ActionResult Disable(int id)
        {
            DetallePrecio detallePrecio = db.DetallesPrecio.Find(id);
            detallePrecio.fechaDesactivacion = DateTime.Now;
            int idS = detallePrecio.idSede;
            db.SaveChanges();

            return RedirectToAction("Edit/"+idS);
        }
    }
}